#include <stdio.h>
#include <stdlib.h>

//链表中的节点结构
typedef struct linkStack
{
    /* data */
    int data;
    struct linkStack * next;
    
}linkStack_t;

//stack为当前的链栈，a表示入栈元素
linkStack_t * push(linkStack_t * stack, int a) {
    //创建存储新元素的节点
    linkStack_t * tempLinkStack = (linkStack_t *)malloc(sizeof(linkStack_t));
    tempLinkStack->data = a;
    //新节点与头节点建立逻辑关系
    tempLinkStack->next = stack;
    //更新头指针的指向
    stack = tempLinkStack;
    return stack;
}

//栈顶元素出链栈的实现函数
linkStack_t * pop(linkStack_t * stack) {
    //栈非空
    if(stack) {
        //声明一个新指针指向栈顶节点
        linkStack_t * tempTop = stack;
        //更新头指针
        stack = stack->next;
        printf("出栈元素：%d ",tempTop->data);
        if(stack) {
            printf("新栈顶元素：%d\n",stack->data);
        } else {
            printf("栈已空\n");
        }
        free(tempTop);
    } else {
        printf("栈内没有元素");
        return stack;
    }
    return stack;
}

int main(int argc, char * argv[]) {
    linkStack_t * stack = NULL;
    for(int i=1; i<5; i++) {
        stack = push(stack, i);
    }

    for(int j=0; j<5; j++) {
        stack = pop(stack);
    }
    return 0;
}